"""
中央内容区域组件，包含插播音频和音画同步标签页
"""
from PyQt5.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QTabWidget, QGroupBox, 
    QLabel, QTextEdit, QTableWidget, QTableWidgetItem, QHeaderView,
    QCheckBox, QLineEdit, QPushButton
)
from PyQt5.QtCore import Qt, pyqtSignal, QTimer
from datetime import datetime

from app.ui.components.styled_button import StyledButton
from app.ui.components.styled_line_edit import StyledLineEdit
from app.services.service_locator import ServiceLocator
from app.services.sync_service import ISyncService
from app.ui.modules.sync_module import SyncModule
from app.services.audio_service import IAudioService
from app.models.audio_item import AudioItem
import uuid

class ContentPanel(QWidget):
    """
    中央内容区域组件，包含插播音频和音画同步标签页
    """
    
    # 定义信号
    message_sent = pyqtSignal(str)
    sync_status_changed = pyqtSignal(bool)
    
    def __init__(self, parent=None):
        """
        初始化中央内容区域
        """
        super().__init__(parent)
        self._init_ui()
    
    def _init_ui(self):
        """
        初始化UI
        """
        # 创建主布局
        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(5)
        
        # 创建选项卡控件
        self._create_tabs()
        
        # 设置面板伸展
        self.setMinimumWidth(300)
        
        # 加载音画同步项目
        QTimer.singleShot(100, self._load_sync_items)
    
    def _create_tabs(self):
        """
        创建选项卡控件
        """
        self.center_tabs = QTabWidget()
        self.center_tabs.setStyleSheet("""
            QTabWidget::pane {
                border: 1px solid #ddd;
                border-radius: 3px;
                background-color: #fff;
            }
            QTabBar::tab {
                background-color: #f5f5f5;
                border: 1px solid #ddd;
                border-bottom: none;
                border-top-left-radius: 3px;
                border-top-right-radius: 3px;
                padding: 8px 12px;
                margin-right: 2px;
                color: #666;
                font-weight: normal;
            }
            QTabBar::tab:selected {
                background-color: #fff;
                border-bottom: 2px solid #2196F3;
                color: #2196F3;
                font-weight: bold;
            }
            QTabBar::tab:hover:!selected {
                background-color: #e6e6e6;
                border-bottom: 1px solid #ccc;
            }
        """)
        
        # 创建插播音频标签页
        self._create_audio_tab()
        
        # 创建音画同步标签页
        self._create_sync_tab()
        
        # 将标签页添加到选项卡控件
        self.center_tabs.addTab(self.audio_tab, "插播记录")
        self.center_tabs.addTab(self.sync_tab, "音画同步")
        
        # 添加选项卡控件到中央布局
        self.layout.addWidget(self.center_tabs)
    
    def _create_audio_tab(self):
        """
        创建插播音频标签页
        """
        # 创建插播记录选项卡
        self.audio_tab = QWidget()
        audio_layout = QVBoxLayout(self.audio_tab)
        audio_layout.setContentsMargins(10, 10, 10, 10)
        audio_layout.setSpacing(10)
        
        # 创建插播记录列表
        self.insert_list = QTableWidget(0, 2)
        self.insert_list.setHorizontalHeaderLabels(["类型", "内容"])
        self.insert_list.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
        self.insert_list.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
        self.insert_list.verticalHeader().setVisible(False)
        # 设置表格为只读模式
        self.insert_list.setEditTriggers(QTableWidget.NoEditTriggers)
        # 设置行高
        self.insert_list.verticalHeader().setDefaultSectionSize(28)
        
        self.insert_list.setStyleSheet("""
            QTableWidget {
                border: 1px solid #ddd;
                border-radius: 3px;
                background-color: #fff;
                selection-background-color: #e6f3ff;
            }
            QTableWidget::item {
                padding: 4px;
                border-bottom: 1px solid #eee;
            }
            QHeaderView::section {
                background-color: #f5f5f5;
                padding: 4px;
                border: none;
                border-bottom: 1px solid #ddd;
                font-weight: bold;
            }
        """)
        
        # 创建插播输入区域
        input_layout = QHBoxLayout()
        self.insert_input = QLineEdit()
        self.insert_input.setPlaceholderText("输入要插播的内容...")
        self.insert_input.returnPressed.connect(self._on_send_message)
        
        # 创建发送按钮 - 使用StyledButton替换普通QPushButton
        send_button = StyledButton("发送", button_type=StyledButton.PRIMARY)
        send_button.setMinimumSize(100, 36)  # 设置更大的按钮尺寸
        send_button.clicked.connect(self._on_send_message)
        
        # 添加到布局
        input_layout.addWidget(self.insert_input)
        input_layout.addWidget(send_button)
        
        audio_layout.addWidget(self.insert_list)
        audio_layout.addLayout(input_layout)
    
    def _create_sync_tab(self):
        """
        创建音画同步标签页
        """
        # 使用SyncModule作为音画同步标签页
        self.sync_tab = SyncModule()
        
        # 连接信号
        self.sync_tab.sync_status_changed.connect(self.sync_status_changed.emit)
    
    def _on_send_message(self):
        """
        处理发送消息事件
        """
        # 获取插播内容
        content = self.insert_input.text().strip()
        if not content:
            return
        
        # 清空输入框
        self.insert_input.clear()
        
        # 添加到插播记录
        self._add_to_insert_list("插播", content)
        
        # 不再直接添加到播放队列，而是通过信号让control_panel处理
        # self._add_to_playlist("插播", content, is_temporary=True)
        
        # 发送消息发送信号
        self.message_sent.emit(content)
    
    def _add_to_insert_list(self, type_text, content):
        """
        添加到插播记录
        
        @param type_text: 类型文本
        @param content: 内容
        """
        # 获取当前行数
        row = self.insert_list.rowCount()
        
        # 插入新行
        self.insert_list.insertRow(row)
        
        # 设置类型
        type_item = QTableWidgetItem(type_text)
        self.insert_list.setItem(row, 0, type_item)
        
        # 设置内容
        content_item = QTableWidgetItem(content)
        self.insert_list.setItem(row, 1, content_item)
        
        # 滚动到底部
        self.insert_list.scrollToBottom()
    
    def _add_to_playlist(self, type_text, content, is_temporary=False):
        """
        添加到播放队列
        
        @param type_text: 类型文本
        @param content: 内容
        @param is_temporary: 是否为临时话术
        """
        # 获取音频服务
        audio_service = ServiceLocator.get(IAudioService)
        if not audio_service:
            return
        
        # 创建音频项
        audio_item = AudioItem(
            id=str(uuid.uuid4()),
            file_path="",
            title=content,
            source_type=self._convert_type(type_text),
            metadata={"original_type": type_text, "is_temporary": is_temporary}
        )
        
        # 根据是否为临时话术决定添加方式
        if is_temporary:
            audio_service.add_to_queue_front(audio_item)
        else:
            audio_service.add_to_queue(audio_item)
    
    def _convert_type(self, type_text):
        """
        转换类型
        
        @param type_text: 类型文本
        @return: 源类型
        """
        type_map = {
            "主话术": "main_speech",
            "插播": "insert",
            "礼物": "gift",
            "进入": "enter",
            "关键词": "keyword",
            "报时": "time"
        }
        return type_map.get(type_text, "unknown")
    
    def _on_sync_now_clicked(self):
        """
        处理开启按钮点击事件
        
        注意：此方法已移至SyncModule类中，保留此方法是为了兼容性
        """
        pass
    
    def add_sync_item(self, speech, video, keyword):
        """
        添加音画同步项目
        
        @param speech: 话术
        @param video: 视频
        @param keyword: 关键词
        """
        # 委托给SyncModule处理
        self.sync_tab.add_sync_item(speech, video, keyword)
    
    def _load_sync_items(self):
        """
        加载音画同步项目
        """
        if hasattr(self, 'sync_tab') and hasattr(self.sync_tab, 'load_sync_items'):
            self.sync_tab.load_sync_items() 